package io;

import java.io.*;
import java.util.Scanner;

public class IODemo10 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //1.先让用户指定一个要搜索的根目录
        System.out.println("请输入要扫描的根目录：");
        //将用户输入的内容构造常File对象
        File rootDir = new File(scanner.next());
        //判断一下输入的路径名表示的文件是否为一个目录
        if(!rootDir.isDirectory()){
            System.out.println("输入有误，你输入的目录不存在！");
            return;
        }
        //2.让用户输入一个要查的词
        System.out.println("请输入要查询的词：");
        String word = scanner.next();

        //3.递归的进行目录或者文件的遍历
        scanDir(rootDir,word);

    }

    private static void scanDir(File rootDir, String word) {
        //列出当前rootDir中的内容，没有内容，直接递归结束
        File[] files = rootDir.listFiles();//返回rootDir对象（d盘）下的所有文件
        if(files == null){
            //当前rootDir是一个控的目录，这里啥都没有。
            //就没有必要在递归了，直接返回就行。
            return;
        }
        //目录中有内容，就遍历目录中的每个元素
        for(File f:files){//通过这个for循环遍历这个文件数组
            //设置一个日志
            System.out.println("当前搜索到："+f.getAbsoluteFile());//打印文件的绝对路径
            if(f.isFile()){
                //判断是普通文件
                //打开文件，读取内容，比较看是否包含上述关键词
                String content = readFile(f);
                //判断看读到的文件内容中是否包含关键字
                if(content.contains(word)){
                    //文件中有要查中的关键字，则输出这个文件的绝对路径
                    System.out.println(f.getAbsoluteFile()+"包含要查找的关键字");
                }
            }else if(f.isDirectory()){
                //判断是目录
                scanDir(f,word);//此处的递归就是以但钱f这个目录作为起点，搜索t目录里面的内容。
            }else{
                //不是普通文件，也不是目录文件直接跳过,以Linux为例，文件种类有很多，普通文件，目录文件，管道文件...
                continue;
            }

        }
    }
    //读取文件的整个内容，返回出来
    private static String readFile(File f) {
        //使用字符流来读取，由于咱们匹配的是字符串，此处只能按照字符流处理，才是有意义的。
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)){
            //一次读一个字符，把读到的结果给拼装到StringBuffer中，同意转成String
            while(true){
                int c = reader.read();
                if(c == -1){
                    break;
                }
                //再进行字符串拼接的时候，需要将刚刚读取到的c数据强转成char类型，c的类型本身是一个int,为了防止超出char的范围
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
